home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / russell / russell.lha / examples / memo.r < prev    next >
Text File  |  1989-12-29  |  1KB  |  55 lines

  1. (* This should be compiled with -cpL *)
  2. #define impure var Void
  3.  
  4. (*
  5.  * Turn a function into one that remembers some previous arguments
  6.  * and the corresponding results.
  7.  * The function hash takes an argument of type T1 and produces
  8.  * a Short integer >= 0 and < limit.
  9.  *)
  10. func[fn: func[val T1; impure]val T2; hash: func[val T1] val Short;
  11.      limit: val Short; T1: type t {=; put: func[val t] val t};
  12.      T2: type{}] func[val T1; impure] val T2 {
  13.   let
  14.     arg_res == prod {arg: val T1; result: val T2};
  15.     table_entry == union {
  16.                        present: val arg_res;
  17.                        not_present: val Void;
  18.            }
  19.                    with TE {
  20.                NNew == func[] {
  21.                    let
  22.                        x == TE$New[]
  23.                                    in
  24.                                        x := TE$from_not_present[Null[]];
  25.                        x
  26.                    ni
  27.                    }
  28.                    }
  29.            with TE {
  30.                New == TE$NNew;
  31.            };
  32.     table_tp == Array[limit, table_entry];
  33.     table == table_tp$New[];
  34.   in
  35.     func[x: val T1; impure] {
  36.       let
  37.     te == table.hash[x]
  38.       in
  39.         if
  40.           is_present[te] cand arg[to_present[te]] = x  ==>
  41.               result[to_present[te]]
  42.         # else ==>
  43.               let
  44.         res == fn[x]
  45.           in
  46.                 te := table_entry$from_present[arg_res$Mk[x, res]];
  47.         res
  48.           ni
  49.     fi
  50.       ni
  51.     }
  52.   ni
  53. }
  54.      
  55.